package com.yanchengtect.demo.progress.dao;

import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.Date;
import java.util.HashMap;

import org.springframework.jdbc.core.RowMapper;

import com.yanchengtect.demo.progress.utils.YCStringUtil;

/**
* @author 文心雕龙 Email：xuwenlong@shike8888.com
* @version 创建时间：2018年9月5日 下午2:03:43
* 类说明
*/
public class RowMapperUtil<T> implements RowMapper<T> {

    private Class<?> targetClazz;
 
    private HashMap<String, Field> fieldMap;
 
    
    
    /**
     * 构造函数.
     * @param targetClazz
     */
    public RowMapperUtil(Class<?> targetClazz) {
        this.targetClazz = targetClazz;
        fieldMap = new HashMap<String,Field>();
        Field[] fields = targetClazz.getDeclaredFields();
        for (Field field : fields) {
        	
        	String name = YCStringUtil.camel2Underline(field.getName());
            // 必须约定数据库字段和实体类属性名的关系。
            fieldMap.put(name, field);
        }
    }
 
    
  

    @SuppressWarnings("unchecked")
	public T mapRow(ResultSet rs, int arg1) throws SQLException {
        T obj = null;
 
        try {
            obj = (T) targetClazz.newInstance();
 
            final ResultSetMetaData metaData = rs.getMetaData();
            int columnLength = metaData.getColumnCount();
            String columnName = null;
 
            for (int i = 1; i <= columnLength; i++) {
                columnName = metaData.getColumnName(i);
                
                Class<?> fieldClazz = fieldMap.get(columnName).getType();
                Field field = fieldMap.get(columnName);
                field.setAccessible(true);
 
                // fieldClazz == Character.class || fieldClazz == char.class
                if (fieldClazz == int.class || fieldClazz == Integer.class) { // int
                    field.set(obj, rs.getInt(columnName));
                } else if (fieldClazz == boolean.class || fieldClazz == Boolean.class) { // boolean
                    field.set(obj, rs.getBoolean(columnName));
                } else if (fieldClazz == String.class) { // string
                    field.set(obj, rs.getString(columnName));
                } else if (fieldClazz == float.class || fieldClazz==Float.class) { // float
                    field.set(obj, rs.getFloat(columnName));
                } else if (fieldClazz == double.class || fieldClazz == Double.class) { // double
                    field.set(obj, rs.getDouble(columnName));
                } else if (fieldClazz == BigDecimal.class) { // bigdecimal
                    field.set(obj, rs.getBigDecimal(columnName));
                } else if (fieldClazz == short.class || fieldClazz == Short.class) { // short
                    field.set(obj, rs.getShort(columnName));
                } else if (fieldClazz == Date.class) { // date
                    field.set(obj, rs.getDate(columnName));
                } else if (fieldClazz == Timestamp.class) { // timestamp
                    field.set(obj, rs.getTimestamp(columnName));
                } else if (fieldClazz == Long.class || fieldClazz == long.class) { // long
                    field.set(obj, rs.getLong(columnName));
                }
 
                field.setAccessible(false);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
 
        return obj;
    }
}
